package tpN2.ejercicioN11;

import java.util.ArrayList;

public abstract class Memoria {
	
	private ArrayList<Integer> almacenamiento = new ArrayList<Integer>();
	private int palabras;
	private int memDisponible;
	private int memUtilizada;
	private int bits;
	private int tamanio;
	private static ArrayList<Integer> potencias2 = new ArrayList<Integer>();


	public Memoria(int tamanio, int bits){
		cargarPotencias2();
		this.bits = setBits(bits);
		tamanio = (tamanio < 1) ? 1 : tamanio;
		this.tamanio = tamanio * 1024;
		this.palabras = (tamanio * 1024) / this.bits;
	}
	public static Integer setBits(int bits){
		int b;
		if (verificarBits(bits))
			b = bits;
		else
			b = 8;
		return b;
	}
	public static boolean verificarBits(int bits){
		for (int i=0; i<potencias2.size(); i++){
			if (i == bits)
				return true;
			else if (bits < i)
				return false;
		}
		return false;
	}	
	public static void cargarPotencias2(){
		for (int i=3; i<20; i++)
			potencias2.add(2^i);
	}
	public void guardarPalabra(int dato){
		this.almacenamiento.add(dato);
	}
	public void quitarDeLaLista(){
		this.almacenamiento.remove(almacenamiento.size() - 1);
	}
	public void borrarTodaLaMemoria(){
		this.almacenamiento = new ArrayList<Integer>();
		System.out.println("\nBorrando datos de la MEMORIA . . .\n");
	}
	public int getMemoriaDisponible(){
		this.memDisponible = palabras - almacenamiento.size();
		return this.memDisponible;
	}	
	public int getMemoriaUtilizada(){
		this.memUtilizada = almacenamiento.size();
		return this.memUtilizada;
	}
	public int getTamanio() {
		return this.tamanio;
	}
	public int getBits() {
		return this.bits;
	}
	public int getPalabras() {
		return palabras;
	}
	
	public abstract void guardarDatos(int dato);
	
	public abstract void borrarDatos();
	
	public abstract void verEstadoMemoria();
}
